#include <stdio.h>
// 提供标准输入输出函数，如 printf 用于输出信息到控制台
#include <string.h>
// 包含字符串处理函数，本代码虽未直接使用，但为可能的扩展预留
#include <signal.h>
// 用于信号处理相关的函数和结构体，如 sigaction 可设置信号处理函数
#include <sys/types.h>
// 定义系统相关的数据类型，是使用 open、read 等函数的基础
#include <fcntl.h>
// 包含文件控制相关的函数和宏定义，open 函数源于此头文件
#include <unistd.h>
// 包含很多 Unix 标准的系统调用，如 read、close 等
#include <stdlib.h>
// 提供通用工具函数，如 exit 用于终止程序

#define LEN 1001
// 定义常量 LEN，值为 1001，意味着后续缓冲区最大可存储 1000 个字符加字符串结束符 '\0'
char buf[LEN];
// 定义一个字符数组 buf，作为存储从文件读取内容的缓冲区

// 信号处理函数，当程序接收到特定信号时会被调用
// number 代表接收到的信号编号
// siginfo 指向包含信号附加信息的结构体指针
// empty 未使用的指针，通常用于传递上下文信息
void sig_handler(int number, siginfo_t *siginfo, void *empty) {
    printf("Received ^C signal\n");
    // 当接收到信号时，在控制台输出提示信息
}

int main() {
    int size, fd;
    // 声明两个整型变量，size 用于存储读取的字符数量，fd 是文件描述符，用于标识打开的文件

    fd = open("abc.txt", O_RDONLY);
    // 以只读模式打开名为 abc.txt 的文件，若成功，fd 返回非负整数作为文件描述符；失败则返回 -1
    if (fd < 0) {
        perror("open failed");
        // 若打开失败，输出错误信息
        exit(EXIT_FAILURE);
        // 终止程序并返回失败状态
    }

    struct sigaction act;
    // 定义一个 sigaction 结构体变量 act，用于设置信号处理方式
    act.sa_sigaction = sig_handler;
    // 将信号处理函数 sig_handler 赋值给 act 结构体的 sa_sigaction 成员
    act.sa_flags = SA_SIGINFO | SA_RESTART;
    // 设置标志位，SA_SIGINFO 表示使用带附加信息的信号处理函数，SA_RESTART 表示在信号处理后重启被中断的系统调用

    if (sigaction(SIGINT, &act, NULL) < 0) {
        // 使用 sigaction 函数为 SIGINT 信号（通常是用户按下 Ctrl+C 产生的信号）设置处理函数
        printf("install signal error\n");
        // 若设置失败，输出错误信息
        exit(EXIT_FAILURE);
        // 终止程序并返回失败状态
    }

    size = read(fd, buf, LEN - 1);
    // 从文件描述符 fd 所指向的文件中读取最多 LEN - 1 个字符到缓冲区 buf 中，size 存储实际读取的字符数量
    if (size < 0) {
        perror("error");
        // 若读取失败，输出错误信息
        close(fd);
        // 关闭文件描述符 fd
        exit(EXIT_FAILURE);
        // 终止程序并返回失败状态
    }

    buf[size] = '\0';
    // 在读取的内容末尾添加字符串结束符 '\0'，使 buf 成为一个合法的 C 字符串

    printf("I have read %d characters\n", size);
    // 输出实际读取的字符数量
    printf("Content read from file:\n%s\n", buf);
    // 输出从文件中读取的内容

    close(fd);
    // 关闭文件描述符 fd，释放相关资源
    return 0;
    // 程序正常结束，返回状态码 0
}